﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Cliente
{
    public class ClienteBL
    {

        public int AddEmpresa(string razonSocial,
                                string RUC,
                                string telefono,
                                string celular,
                                string email,
                                string web,
                                string fax,
                                bool bitActivo,
                                int idEstado,
                                string emailAlternativo,
                                string comentario,
                                string direccion,
                                string referencia,
                                string urbanizacion,
                                int   idDistrito)
        {
            using (TransactionScope ts = new TransactionScope())
            {

               
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                DAL.Cliente cliente = new DAL.Cliente();
                //string descripcion = "{0}{1}{2}".Fmt(RUC,(RUC.Length==0?"":"-"), razonSocial);
                string descripcion = razonSocial;
                Direccion direccionOBJ = new Direccion();

                    //registro direccion
                    direccionOBJ.AddSet(_db, direccion, referencia, idDistrito, urbanizacion);
                    _db.SubmitChanges();

                //-----------//verificamos que no se repita el cliente en la base de datos

                    if (_db.Clientes.Where(p => p.idTipoDocumento == 5 & p.numDocumento == RUC).Count() > 0)
                    {
                        throw new Exception("Existe el Cliente {0} - {1} en el Sistema".Fmt(RUC, descripcion));
                    }

                //-----------


                cliente.SetAddEmpresa(_db,
                    descripcion,
                    razonSocial,
                    5, //RUC
                    RUC,
                    telefono,
                    celular,
                    email,
                    web,
                    fax,
                    bitActivo,
                    idEstado,
                    emailAlternativo,
                    comentario,
                    direccionOBJ.idInternal);

                _db.SubmitChanges();
                ts.Complete();
                return cliente.idInternal;
            }



        }


        public int UpdateEmpresa(int idCliente,
                                string razonSocial,
                                string RUC,
                                string telefono,
                                string celular,
                                string email,
                                string web,
                                string fax,
                                bool bitActivo,
                                int idEstado,
                                string emailAlternativo,
                                 string comentario,
                                 string direccion,
                                string referencia,
                                string urbanizacion,
                                int idDistrito)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                DAL.Cliente cliente = _db.Clientes.Single(p => p.idInternal == idCliente);
                //string descripcion = "{0}-{1}".Fmt(RUC,razonSocial);
                string descripcion = razonSocial;
                Direccion direccionOBJ = _db.Direccions.Single(p=>p.idInternal==cliente.idDireccion);
               

                //-----------//verificamos que no se repita el cliente en la base de datos

                if (_db.Clientes.Where(p => p.idTipoDocumento == 5 & p.numDocumento == RUC & p.idInternal != idCliente).Count() > 0)
                {
                    throw new Exception("Existe el Cliente {0} - {1} en el Sistema".Fmt(RUC, descripcion));
                }

                //-----------
                //registro direccion
                direccionOBJ.UpdateSet(direccion, referencia, idDistrito, urbanizacion);
                _db.SubmitChanges();

                //-------------
                cliente.SetUpdateEmpresa(_db,
                    descripcion,
                    razonSocial,
                    5, //RUC
                    RUC,
                    telefono,
                    celular,
                    email,
                    web,
                    fax,
                    bitActivo,
                    idEstado,
                    emailAlternativo,
                    comentario,
                    direccionOBJ.idInternal);

                _db.SubmitChanges();
                ts.Complete();
                return cliente.idInternal;
            }



        }




        public int AddPersona(string nombre,
                                string apellidoPat,
                                string apellidoMat,
                                int idNacionalidad,
                                int idDocumentoTipo,
                                string numDocumento,
                                string Ocupacion,
                                int idGenero,
                                bool bitConviviente,
                                string telefono,
                                string celular,
                                string email,
                                string web,
                                string fax,
                                int idEstadoCivil,
                                bool bitActivo,
                                int idEstado,
                                string emailAlternativo,
                                string comentario,
                                string direccion,
                                string referencia,
                                string urbanizacion,
                                int idDistrito,
                                string conyuge,
                                string DNIConyuge,
                                string emailConyuge,
                                string telefonoConyuge)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                DAL.Cliente cliente = new DAL.Cliente();
               // string descripcion = "{1} {2} {3}".Fmt(numDocumento, nombre,apellidoPat,apellidoMat);
                string descripcion = "{1} {2} {3}".Fmt(numDocumento, nombre, apellidoPat, apellidoMat);

                //-----------//verificamos que no se repita el cliente en la base de datos

                if (numDocumento.Trim() == "")
                {
                    throw new Exception("Verifique numero de Documento".Fmt(numDocumento));
                }

                if (_db.Clientes.Where(p => p.idTipoDocumento == idDocumentoTipo & p.numDocumento.Trim() == numDocumento.Trim() ).Count() > 0)
                {
                    throw new Exception("Existe el Cliente {0} - {1} en el Sistema".Fmt(numDocumento, descripcion));
                }

                //-----------
                if (conyuge.Length > 0)
                {

                    if (DNIConyuge.Length < 8)
                    {
                        throw new Exception("Verifique  el DNI del Conyuge {0}".Fmt(DNIConyuge));
                    }
                }

                Direccion direccionOBJ = new Direccion();

                //registro direccion
                direccionOBJ.AddSet(_db, direccion, referencia, idDistrito, urbanizacion);
                _db.SubmitChanges();



                cliente.SetAddPersona(_db,
                        descripcion,
                        nombre,
                        apellidoPat,
                        apellidoMat,
                        idNacionalidad,
                        idDocumentoTipo,
                        numDocumento,
                        Ocupacion,
                        idGenero,
                        bitConviviente,
                        telefono,
                        celular,
                        email,
                        web,
                        fax,
                        idEstadoCivil,
                        bitActivo,
                        idEstado,
                        emailAlternativo,
                        comentario,
                        direccionOBJ.idInternal,
                        conyuge,
                        DNIConyuge, 
                        emailConyuge, 
                        telefonoConyuge);

                _db.SubmitChanges();
                ts.Complete();
                return cliente.idInternal;
            }



        }


        public int UpdatePersona(int idCliente,
                                string nombre,
                               string apellidoPat,
                               string apellidoMat,
                               int idNacionalidad,
                               int idDocumentoTipo,
                               string numDocumento,
                               string Ocupacion,
                               int idGenero,
                               bool bitConviviente,
                               string telefono,
                               string celular,
                               string email,
                               string web,
                                string fax,
                                int idEstadoCivil,
                                bool bitActivo,
                                int idEstado,
                                string emailAlternativo,
                                string comentario,
                                string direccion,
                                string referencia,
                                string urbanizacion,
                                int idDistrito,
                                 string   conyuge,
                                 string   DNIConyuge, 
                                 string   emailConyuge,
                                 string telefonoConyuge)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                DAL.Cliente cliente = _db.Clientes.Single(p => p.idInternal == idCliente);
                //string descripcion = "{0}-{1} {2} {3}".Fmt(numDocumento, nombre, apellidoPat, apellidoMat);
                string descripcion = "{1} {2} {3}".Fmt(numDocumento, nombre, apellidoPat, apellidoMat);

                //-----------//verificamos que no se repita el cliente en la base de datos

                if (_db.Clientes.Where(p => p.idTipoDocumento == idDocumentoTipo & p.numDocumento == numDocumento & p.idInternal!=idCliente).Count() > 0)
                {
                    throw new Exception("Existe el Cliente {0} - {1} en el Sistema".Fmt(numDocumento, descripcion));
                }

                //-----------


                Direccion direccionOBJ = _db.Direccions.Single(p=>p.idInternal==cliente.idDireccion);

                //registro direccion
                direccionOBJ.UpdateSet(direccion, referencia, idDistrito, urbanizacion);
                _db.SubmitChanges();



                cliente.SetUpdatePersona(_db,
                    descripcion,
                    nombre,
                    apellidoPat,
                    apellidoMat,
                    idNacionalidad,
                    idDocumentoTipo,
                    numDocumento,
                    Ocupacion,
                    idGenero,
                    bitConviviente,
                    telefono,
                    celular,
                    email,
                    web,
                    fax,
                    idEstadoCivil,
                    bitActivo,
                    idEstado,
                    emailAlternativo,
                    comentario,
                    direccionOBJ.idInternal,
                    conyuge,
                    DNIConyuge, 
                    emailConyuge,
                    telefonoConyuge);

               

                _db.SubmitChanges();
                ts.Complete();
                return cliente.idInternal;
            }



        }




        public void Delete(int idCliente)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                DAL.Cliente cliente = _db.Clientes.Single(p => p.idInternal == idCliente);

                _db.Clientes.DeleteOnSubmit(cliente);
                _db.SubmitChanges();

                ts.Complete();

            }
        }


         
    }
}
